/**
 * 微前端生命周期处理逻辑
 * */ 
import { findAppByRoute } from '../utils'
import { getMainLifeCycle } from '../const/mainLifeCycle'
import { loadHtml } from '../loader';
// 卸载上一个子应用，加载当前匹配到的应用
export const lifeCycle = async () => {
    // 获取上一个子应用： 卸载
    const prevApp = findAppByRoute(window.ORIGIN_APP);

    // 获取需要跳转的子应用： 跳转,执行相关生命周期
    const nextApp = findAppByRoute(window.CURRENT_SUB_APP);

    if(!nextApp) {
        return;
    }
    console.log('prevApp==', prevApp)
    // 卸载上一个子应用
    if(prevApp && prevApp.unmount) {

        // 销毁沙箱
        if(prevApp.proxy) {
            console.log('===========销毁沙箱==========')
            prevApp.proxy.inactive();
        }
        await destoryed(prevApp);
    }

    // 加载下一个应用
    const app = await beforeLoad(nextApp)
    console.log('app==', app)
    await mounted(app)
}

// 定义微前端生命周期
// 使用async/await 保证生命周期函数依次执行
export const beforeLoad = async (app) => {
    await runMainLifeCycle('beforeLoad')
    app && app.beforeLoad && app.beforeLoad();
     
    // 这里appContext与nextApp关系？
    const subApp = await loadHtml(app);  // 加载下个子应用内容
    subApp && subApp.beforeLoad && subApp.beforeLoad();
    return subApp

}

export const mounted = async (app) => {
    app && app.mount && app.mount({
        appInfo: app.appInfo,
        entry: app.entry
    })
    await runMainLifeCycle('mounted')
}

export const destoryed = async (app) => {
    app && app.unmount && app.unmount();
    // 对应执行主应用生命周期
    await runMainLifeCycle('destoryed')
}

// 执行主应用生命周期
export const runMainLifeCycle = async (type) => {
    // 获取主应用生命周期
    const mainLife =  getMainLifeCycle()
    // 主应用生命周期都是一个数组，数组中定义的是函数，每个函数都有可能是异步的，需要async/await处理
    await Promise.all(mainLife[type].map( async item => await item()))
}